home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok15.lha / Seafarers_Manual / Source / C5P3.mod < prev    next >
Text File  |  1993-08-15  |  3KB  |  96 lines

  1. MODULE C5P3;  (* Chapter 5  Problem 3 *)
  2.  
  3.   (* From the book "Modula-2  A Seafarer's Manual and Shipyard Guide" *)
  4.   (* Page 162   adapted "Amiga M2Modula-2"   11 Mar 1988 *)
  5.  
  6. FROM InOut IMPORT WriteLn,
  7.                   WriteString,
  8.                   WriteCard,
  9.                   ReadCard;
  10. FROM Storage IMPORT ALLOCATE;
  11.                                    
  12. TYPE
  13.   AgePntr = POINTER TO AgeNode;
  14.   AgeNode =            (* list entry, age/next pointer *)
  15.     RECORD
  16.       CrewMemAge : CARDINAL;
  17.       PrevAge : AgePntr;
  18.       NextAge : AgePntr;
  19.     END;
  20.     
  21. VAR
  22.   YoungPntr,            (* list pointers: youngest age *)
  23.   OldPntr,            (*                oldest age *)
  24.   NewPntr,            (*                new age entry *)
  25.   CurrPntr,            (*                current one for search *)
  26.   PrevPntr : AgePntr;        (*                previous one for search *)
  27.   
  28. BEGIN
  29.   YoungPntr := NIL;        (* initially set list null *)
  30.   OldPntr := NIL;
  31.   WriteLn;
  32.   WriteString ("Enter crew ages: ");
  33.   WriteLn;
  34.   
  35.   LOOP
  36.     ALLOCATE (NewPntr, SIZE (NewPntr^));   (* allocate space for list entry *)
  37.     WriteLn;
  38.     ReadCard (NewPntr^.CrewMemAge);    (* accept age from keyboard *)
  39.     IF (NewPntr^.CrewMemAge = 0) THEN    (* age = 0? *)
  40.       EXIT;                (* yes - input done *)
  41.     END;   (* IF *)            (* no - add age in list by
  42.                                            ascending order *)
  43.     PrevPntr := NIL;        (* set previous pointer to NIL *)
  44.     CurrPntr := YoungPntr;    (* set current pointer to youngest *)
  45.     
  46.     (* find place in list where age belongs *)
  47.     WHILE ((CurrPntr # NIL) AND
  48.            (NewPntr^.CrewMemAge > CurrPntr^.CrewMemAge))
  49.            DO
  50.       PrevPntr := CurrPntr;
  51.       CurrPntr := CurrPntr^.NextAge;
  52.     END;   (* WHILE *)        (* quit searching if end of list or new
  53.                                    age <= current age on list *)
  54.                                    
  55.     IF (CurrPntr # NIL) THEN    (* new age <= current age on list? *)
  56.       NewPntr^.NextAge := CurrPntr;    (* yes - put new in front *)
  57.       CurrPntr^.PrevAge := NewPntr;
  58.     ELSE
  59.       NewPntr^.NextAge := NIL;        (* no - put new at end *)
  60.       OldPntr := NewPntr;
  61.     END;   (* IF *)
  62.     
  63.     IF (PrevPntr # NIL) THEN    (* is new before youngest or is list null? *)
  64.       PrevPntr^.NextAge := NewPntr;    (* no - point previous at new *)
  65.       NewPntr^.PrevAge := PrevPntr;
  66.     ELSE
  67.       YoungPntr := NewPntr;        (* yes - point youngest at new *)
  68.       NewPntr^.PrevAge := NIL;
  69.     END;   (* IF *)
  70.     
  71.   END;   (* LOOP *)        (* get next age *)
  72.   
  73.   WriteLn;
  74.   WriteString ("Sorted ages in ascending order:");
  75.   
  76.   CurrPntr := YoungPntr;        (* display ages in ascending order *)
  77.   WHILE (CurrPntr # NIL) DO        (* end of list? *)
  78.     WriteLn;                (* no *)
  79.     WriteCard (CurrPntr^.CrewMemAge,0);
  80.     CurrPntr := CurrPntr^.NextAge;    (* point to next one *)
  81.   END;   (* WHILE *)
  82.   WriteLn;
  83.  
  84.   WriteLn;
  85.   WriteString ("Sorted ages in descending order:");
  86.   
  87.   CurrPntr := OldPntr;            (* display ages in descending order *)
  88.   WHILE (CurrPntr # NIL) DO        (* end of list? *)
  89.     WriteLn;                (* no *)
  90.     WriteCard (CurrPntr^.CrewMemAge,0);
  91.     CurrPntr := CurrPntr^.PrevAge;    (* point to next one *)
  92.   END;   (* WHILE *)
  93.   WriteLn; WriteLn;
  94.  
  95. END C5P3.
  96.